// ===========================================================================
// Copyright (c) 2011-2020 Anlogic Inc. All Right Reserved.
//
// TEL: 86-21-61633787
// WEB: http://www.anlogic.com/
// ===========================================================================
//
//
//  
//
//
// ===========================================================================

`timescale 1ns / 1ps

module RAMB16_S9_S9 ( 
	doa, 
	dia, 
	addra, 
	cea, 
	clka, 
	wea, 
	rsta, 
	dob, 
	dib, 
	addrb, 
	ceb, 
	clkb, 
	web, 
	rstb
);

	output [8:0] doa;						// doa 和 dob：分别是端口A和端口B的输出数据线，宽度为9位。
	output [8:0] dob;

	input  [8:0] dia;						// dia 和 dib：分别是端口A和端口B的输入数据线，宽度为9位。
	input  [8:0] dib;
	input  [10:0] addra;
	input  [10:0] addrb;
	input  wea;
	input  web;
	input  cea;
	input  ceb;
	input  clka;
	input  clkb;
	input  rsta;
	input  rstb;


	// 一个双端口的同步RAM模块，使用了Xilinx FPGA中的EG（Enhanced GigaBit）
	// 系列的BRAM（Block Random Access Memory）。
	EG_LOGIC_BRAM #( 
				.DATA_WIDTH_A(9),			// DATA_WIDTH_A 和 DATA_WIDTH_B：端口A和端口B的数据宽度，这里都是9位。
				.DATA_WIDTH_B(9),			
				.ADDR_WIDTH_A(11),			// ADDR_WIDTH_A 和 ADDR_WIDTH_B：端口A和端口B的地址宽度，这里都是11位。
				.ADDR_WIDTH_B(11),
				.DATA_DEPTH_A(2048),		// DATA_DEPTH_A 和 DATA_DEPTH_B：端口A和端口B的数据深度，即每个端口可以存储的数据量，这里都是2048。
				.DATA_DEPTH_B(2048),
				.MODE("DP"),				// MODE：设置为"DP"，表示这是一个双端口RAM。
				.REGMODE_A("NOREG"),		// REGMODE_A 和 REGMODE_B：设置为"NOREG"，表示输出数据不经过寄存器。
				.REGMODE_B("NOREG"),
				.WRITEMODE_A("WRITETHROUGH"),	// WRITEMODE_A 和 WRITEMODE_B：设置为"WRITETHROUGH"，表示写操作会立即反映到输出上。
				.WRITEMODE_B("WRITETHROUGH"),
				.RESETMODE("SYNC"),			// RESETMODE：设置为"SYNC"，表示复位信号是同步的。
				.IMPLEMENT("9K"),			// IMPLEMENT：指定使用哪种类型的BRAM实现，这里是"9K"。
				.INIT_FILE("NONE"),			// INIT_FILE：指定初始化文件的路径，这里设置为"NONE"，表示不使用初始化文件。
				.FILL_ALL("NONE"))			// FILL_ALL：设置为"NONE"，表示不使用默认的填充模式。
			inst(
				.dia(dia),					// dia 和 dib：分别是端口A和端口B的输入数据线，宽度为9位。
				.dib(dib),			
				.addra(addra),				// addra 和 addrb：分别是端口A和端口B的地址输入线，宽度为11位，
											// 意味着每个端口可以寻址2^11=2048个存储单元。
				.addrb(addrb),
				.cea(cea),					// cea 和 ceb：端口A和端口B的芯片使能信号，当为高电平时启用对应的端口。
				.ceb(ceb),
				.ocea(1'b0),
				.oceb(1'b0),
				.clka(clka),				// clka 和 clkb：端口A和端口B的时钟输入线，用于同步数据的读写操作。
				.clkb(clkb),
				.wea(wea),					// wea 和 web：端口A和端口B的写使能信号，当为高电平时允许写入数据。
				.web(web),
				.bea(1'b0),
				.beb(1'b0),
				.rsta(rsta),				// rsta 和 rstb：端口A和端口B的复位信号，用于将RAM的内容重置到初始状态。
				.rstb(rstb),
				.doa(doa),					// doa 和 dob：分别是端口A和端口B的输出数据线，宽度为9位。
				.dob(dob));


endmodule